#============================================
# 发展史
# 1.网站都没有保存用户功能的需求所有用户访问返回的结果都是一样的
# eg:新闻、博客、文章...
# 2.出现了一些需要保存用户信息的网站
# eg:淘宝、支付宝、京东...
# 以登陆功能为例:如果不保存用户登陆状态也就意味着用户每次访问网站都需要重复的输入
# 用户名和密码(你觉得这样的网站你还想用吗? )
# 当用户第-次登陆成功之后将用户的用户名密码返回给用户浏览器让用户浏览器保存在本
# 地，之后访问网站的时候浏览器自动将保存在浏览器上的用户名和密码发送给服务端，服务端获取
# 之后自动验证
# 早起这种方式具有非常大的安全隐患
# 优化:
# 当用户登陆成功之后，服务端产生一个随机字符串(在服务端保存数据,用kv键值对的形
# 式)，交由客户端浏览器保存
# 随机字符串1 :用户1相关信息
# 随机字符串2 :用户2相关信息
# 随机字符串3:用户3相关信息
# 之后访问服务端的时候，都带着该随机字符串，服务端去数据库中比对是否有对应的随机
# 字符串从而获取到对应的用户信息
# 但是如果你拿到了截获到了该随机字符串，那么你就可以冒充当前用户其实还是有安全隐患的
#你要知道在web领域没有绝对的安全也没有绝对的不安全

# cookie
# 服务端保存在客户端浏览器上的信息都可以称之为cookie
# 它的表现形式一般都是k:v键值对 (可以有多个)
# sess ion
# 数据是保存在服务端的并且它的表现形式一般也是k: v键值对(可以有多个)
# token
# session虽然数据是保存在服务端的但是禁不住数据量大
# 服务端不再保存数据
# 登陆成功之后将一段用户信息进行加密处理(加密算法之后你公司开发知道)
# 将加密之后的结果拼接在信息后面整体返回给浏览器保存
# 浏览器下次访问的时候带着该信息服务端自动切去前面一段信息再次使用自己的加密算法
# 跟浏览器尾部的密文进行比对
# jwt认证
# 三段信息
# (后期会讲)


# 总结:
# 1. cookie就是保存在客户端浏览器上的信息
# 2. sess ion就是保存在服务端上的信息
# 3. session是基于cookie.工作的(其实大部分的保存用户状态的操作都需要使用到cookie)
#============================================
# cookie操作
# #虽然cookie是服务端告诉客户端浏览器需要保存内容
# #但是客户端浏览器可以选择拒绝保存如果禁止了那么只要是需要记录用户状态的网站登陆功
# 能都无法使用了
# #视图函数的返回值
# return HttpResponse( )
# return render( )
# return redirect( )

# obj1 = HttpResponse( )
# #操作cookie
# return obj1

# obj2 = render( )
# #操作cookie
# return obj2




# obj3 = redirect( )
# #操作cookie
# return obj3
# #如果你想要操作cookie, 你就不得不利用obj对象

# obj3.set_cookie('username','jason66')  添加cookie属性
# 直接return obj3 就是携带cookie值访问网址
# max_age
# expires
# 两者都是设置超时时间的并且都是以秒为单位
# 需要注意的是针对IE浏览器需要使用expires

#加盐
# obj.set_signed_cookie(key , value,salt= '盐')
#获取
# request . COOKIES .get(key)
# request.get_ signed_ cookie(key ,salt='盐')

# delete_cookie('username')删除cookie值
# request.COOKIES.get('username') 获取cookie值
# obj = redirect(reverse('home'))
# obj.delete_cookie('username')
#============================================
# 代码操作
# from django.shortcuts import render,redirect,reverse
# from django import forms
# from app01 import models
# # Create your views here.
# class login(forms.Form):
#     username = forms.CharField(max_length=32,min_length=2,label='账号',
#                                error_messages={
#                                    "required":"账号不能为空"
#                                },
#                                widget=forms.widgets.TextInput(attrs={
#                                    'class':'form-control',

#                                }))
#     password = forms.CharField(max_length=32,min_length=2,label='密码',
#                                error_messages={
#                                    "required":"密码不能为空"
#                                },
#                                widget=forms.widgets.PasswordInput(attrs={
#                                    'class': 'form-control',
#                                }))

#     def clean(self):
#         name1 = self.cleaned_data.get('username')
#         password1 = self.cleaned_data.get('password')
#         name2 = models.user.objects.filter(username=name1).first()
#         if not name2:
#             self.add_error('username','此用户未注册')
#         else:
#             password2 = name2.password
#             if password1 != password2:
#                 self.add_error('password','用户密码错误')
#         return self.cleaned_data


# def lp(func):
#     def warrper(request,*args,**kwargs):
#         if request.COOKIES.get('username'):
#             return func(request,*args,**kwargs)
#         else:
#             index = request.get_full_path()
#             return redirect(f'/?next={index}')
#     return warrper

# @lp
# def bky1(request):
#     if request.is_ajax():
#         if request.method == 'POST':
#             obj = redirect(reverse('home'))
#             obj.delete_cookie('username')
#     return render(request, 'bky1.html')

# @lp
# def bky2(request):
#     return render(request, 'bky2.html')

# @lp
# def bky3(request):
#     return render(request, 'bky3.html')

# @lp
# def bky4(request):
#     return render(request, 'bky4.html')


# def home(request):
#     form_obj = login()
#     if request.method == 'POST':
#         form_obj = login(request.POST)
#         if form_obj.is_valid():
#             name = form_obj.cleaned_data.get('username')
#             res = request.GET.get('next')
#             if not res:
#                 obj = redirect(reverse('bky1'))
#             else:
#                 obj = redirect(reverse(res.strip('/')))
#             obj.set_cookie('username', name)
#             return obj
#     return render(request,'home.html',locals())


#============================================
# session
# 设置session
# request.session['key'] = value

# 获取session
# request.session.get( 'key')

# 设置过期时间
# request .session.set_ expiry( )
# 括号内可以放四种类型的参数
# 1.整数
# 多少秒
# 2.日期对象
# 到指定日期就失效
# 3.0
# 一旦当前浏览器窗口关闭立刻失效
# 4.不写
# 失效时间就取决于dj ango内部全局session默认的失效时间

# 清除session
# request .session.delete() # 只删服务端的客户端的不删
# request. session. flush() # 浏览器和服务端都清空(推荐使用 )


# django_session表 中的数据条数是取决于浏览器的
# 同一个计算机上同一个浏览器只会有一条数据生效(当session过期的时候可能会出现很多数据对应的一个浏览器,
# 但是该现象不会持续很久，内部会自动识别数据的清除，你也可以用代码来清除)
# 主要节省服务端数据库资源


# request . session[ ' hobby'] = 'girl '
# 内部发送了那些事
# 1. django内部会自动帮你生成一个随机字符串
# 2. django内部自动将随机字符串和对应的数据存储到django_ session表中
# 2.1先在内存中产生操作数据的缓存
# 2.2在响应结果django中间件的时候才真正的操作数据库
# 3.将产生的随机字符串返回给客户端浏览器保存

# request. session. get( ' hobby')
# 内部发送了那些事
# 1.自动从浏览器请求中获取sess ionid对应的随机字符串
# 2.拿着该随机字符串去django_ sess ion表中查找对应的数据
# 3 如果比对上了则将对应的数据取出并以字典的形式封装到request. session中
# 如果比对不上则request.session.get( )返回的是None
#============================================
# cbv视图添加装饰器
# from django.utils.decorators import method_decorator
# 1.加在CBV视图的get或post方法上
#     @method_decorator(check_login)
#     def post(self, request):
#         print("Home View POST method...")
#         return redirect("/index/")
# 2. 加在dispatch方法上(自己添加)
    # @method_decorator(check_login)
    # def dispatch(self, request, *args, **kwargs):
    #     return super(HomeView, self).dispatch(request, *args, **kwargs)
# 3. 直接加在视图类上，但method_decorator必须传 name 关键字参数
# @method_decorator(check_login, name="get")
# @method_decorator(check_login, name="post")
# class HomeView(View):
#============================================
# obj = redirect(reverse('home'))
# obj.set_cookies(key,v,max_age=..)
# request.COOKIES.get('k')
# obj.delete_cookies('k')


# request.session[k]=vars
# request.session.get('k')
# request.session. flush()